package demo.concurrent.executors.creator;

import org.springframework.scheduling.concurrent.CustomizableThreadFactory;

import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 　　　　　　　   ┏┓　   ┏┓+ +
 * 　　　　　　　┏┛┻━━━┛┻┓ + +
 * 　　　　　　　┃　　　　　　　┃
 * 　　　　　　　┃　　　━　　　┃ ++ + + +
 * 　　　　　　 ████━████ ┃+
 * 　　　　　　　┃　　　　　　　┃ +
 * 　　　　　　　┃　　　┻　　　┃
 * 　　　　　　　┃　　　　　　　┃ + +
 * 　　　　　　　┗━┓　　　┏━┛
 * 　　　　　　　　　┃　　　┃
 * 　　　　　　　　　┃　　　┃ + + + +
 * 　　　　　　　　　┃　　　┃			God beast body, code no BUG
 * 　　　　　　　　　┃　　　┃ +			神兽护体,代码无BUG
 * 　　　　　　　　　┃　　　┃
 * 　　　　　　　　　┃　　　┃　　+
 * 　　　　　　　　　┃　 　　┗━━━┓ + +
 * 　　　　　　　　　┃ 　　　　　　　┣┓
 * 　　　　　　　　　┃ 　　　　　　　┏┛
 * 　　　　　　　　　┗┓┓┏━┳┓┏┛ + + + +
 * 　　　　　　　　　　┃┫┫　┃┫┫
 * 　　　　　　　　　　┗┻┛　┗┻┛+ + + +
 *
 * @title: 线程创建方法
 * @author zhonghaijun
 * @date 2021-03-01
 */
public class DelayCreator {

    //工厂方法，用来创建线程
    public static final  CustomizableThreadFactory customizableThreadFactory = new CustomizableThreadFactory("zhj_");

    public static final DelayQueue delayeds = new DelayQueue<>();

    public static final ThreadPoolExecutor delayThreadPoolExecutor = new ThreadPoolExecutor(2,10,10L,TimeUnit.SECONDS,delayeds,customizableThreadFactory);

    public static class DelayTask implements Delayed,Runnable{
        private Long time;
        private Long start = System.currentTimeMillis();
        private String msg;

        public DelayTask(String msg,Long delay) {
            this.time = delay;
            this.msg = msg;
        }

        /**
         * 获取当前任务时间是否到期
         * @param unit
         * @return
         */
        @Override
        public long getDelay(TimeUnit unit) {
            return unit.convert((start + time) - System.currentTimeMillis(),TimeUnit.MILLISECONDS);
        }

        /**
         * 根据延迟时间进行排序
         * @param o
         * @return
         */
        @Override
        public int compareTo(Delayed o) {
            DelayTask delayTask = (DelayTask) o;
            if(time > delayTask.getTime()){
                return 1;
            }else if(time < delayTask.getTime()){
                return -1;
            }
            return 0;
        }

        public Long getTime() {
            return time;
        }

        public void setTime(Long time) {
            this.time = time;
        }

        public String getMsg() {
            return msg;
        }

        public void setMsg(String msg) {
            this.msg = msg;
        }

        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName()+":"+msg);
        }
    }

}
